package Frame;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Vector;

import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;

import Function.FCActionLibrary;
import VWorldGameStudio.FCAction;

/**
 * 人物行为编辑窗口。针对NPC有用。 方向：dire(Direction)
 */
public class FCEditAction extends JDialog {

	// 路线
	private ArrayList<String> route = new ArrayList<String>();

	/**
	 * 构造函数初始化
	 * 
	 * @param isNew     判断新建或编辑
	 * @param actionLib 行为库
	 */
	public FCEditAction(boolean isNew, FCActionLibrary actionLib) {
		// 设置窗体的标题
		setTitle((!isNew) ? "方块管理-编辑方块" : "方块管理-新建方块");
		// 设置窗体的位置坐标
		setBounds(0, 0, 615, 425);
		// 屏幕组件的格式布局
		setLayout(null);
		// 设置窗体相对于指定组件的位置
		setLocationRelativeTo(null);
		// 设置此窗体不可由用户调整大小
		setResizable(false);
		// 指定对话框为模式对话框，对话框销毁前不可进行其他操作
		setModal(true);

		// 设置动作名称label
		JLabel actionNames = new JLabel("动作名称:");
		actionNames.setBounds(10, 10, 60, 20);
		this.add(actionNames);

		// 动作名称文本框
		JTextField actionName = new JTextField();
		actionName.setBounds(70, 10, 130, 20);
		// 设置是否可编辑
		actionName.setEnabled(isNew);
		this.add(actionName);

		// 设置动作类型label
		JLabel actionTypeLabel = new JLabel("动作类型:");
		actionTypeLabel.setBounds(210, 10, 60, 20);
		this.add(actionTypeLabel);

		// 动作类型
		JComboBox<String> actionTypes = new JComboBox<String>();
		actionTypes.setBounds(270, 10, 130, 20);
		// 随机
		actionTypes.addItem("random");
		// 原地踏步
		actionTypes.addItem("step");
		// 原地不动
		actionTypes.addItem("stop");
		// 固定
		actionTypes.addItem("fixed");
		actionTypes.addItem("randomaction");
		this.add(actionTypes);

		// 设置首次朝向label
		JLabel firstDirLabel = new JLabel("首次朝向:");
		firstDirLabel.setBounds(410, 10, 60, 20);
		this.add(firstDirLabel);



		// 设置首次朝向
		JComboBox<String> firstDir = new JComboBox<String>();
		firstDir.setBounds(470, 10, 130, 20);
		// 下
		firstDir.addItem("down");
		// 左
		firstDir.addItem("left");
		// 右
		firstDir.addItem("right");
		// 上
		firstDir.addItem("up");
		this.add(firstDir);

		// 设置行走方向label
		JLabel moveDirLabel = new JLabel("行走方向:");
		moveDirLabel.setBounds(10, 40, 60, 20);
		this.add(moveDirLabel);

		// 设置行走方向
		JComboBox<String> moveDir = new JComboBox<String>();
		moveDir.setBounds(70, 40, 130, 20);
		// i = [0, 3]
		for (int i = 0; i < 4; i++) {
			moveDir.addItem(i + "");
		}
		this.add(moveDir);

		// 设置行走步数label
		JLabel moveStepsLabel = new JLabel("行走步数:");
		moveStepsLabel.setBounds(210, 40, 60, 20);
		this.add(moveStepsLabel);

		// 设置行走步数
		JComboBox<String> moveSteps = new JComboBox<String>();
		moveSteps.setBounds(270, 40, 60, 20);
		// i = [0, 10]
		for (int i = 0; i < 11; i++) {
			moveSteps.addItem(i + "");
		}
		this.add(moveSteps);

		// 添加按钮
		JButton addButton = new JButton("添加");
		addButton.setBounds(330, 40, 70, 20);
		this.add(addButton);

		// 添加文本域
		JTextArea jTextArea = new JTextArea();
		// 添加滚动面板
		JScrollPane jScrollPane = new JScrollPane(jTextArea);
		jScrollPane.setBounds(10, 70, 390, 100);
		// VERTICAL_SCROLLBAR_AS_NEEDED = 20
		jScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
		this.add(jScrollPane);

		// 动作选择Label
		JLabel actionChooseLabel = new JLabel("动作选择:");
		actionChooseLabel.setBounds(410, 50, 60, 20);
		if (!isNew) {
			this.add(actionChooseLabel);
		}

		// 动作选择
		JComboBox<String> actionChoose = new JComboBox<String>();
		actionChoose.setBounds(410, 80, 160, 20);
		// FCActionLibrary.getActionNameOfID
		for (int i = 0; i < actionLib.getActionNum(); i++) {
			actionChoose.addItem(actionLib.getActionNameOfID(i));
		}
		if (!isNew) {
			this.add(actionChoose);
		}
		JButton reEdit = new JButton("清除步数");
		reEdit.setBounds(410, 110, 100, 20);
		if (!isNew) {
			this.add(reEdit);
		}
		reEdit.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				route.clear();
				jTextArea.removeAll();
				jTextArea.setText("");
				jTextArea.updateUI();
			}
		});

		// 确认按钮
		JButton okButton = new JButton("确认");
		okButton.setBounds(10, 370, 590, 20);
		this.add(okButton);

		// 动作选择的监听器
		actionChoose.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 创建动作实体类
				FCAction action = actionLib.getActionOfName(actionChoose.getSelectedItem().toString());
				actionName.setText(action.getName());
				actionTypes.setSelectedItem(action.getType());
				route = action.getFixedRoute();
				jTextArea.removeAll();
				// 添加动作信息列表
				for (int i = 0; i < route.size(); i++) {
					jTextArea.append("第" + (i + 1) + "号动作:" + route.get(i) + "\n");
					jTextArea.setCaretPosition(i + 1);
				}
			}
		});

		// 添加按钮的监听器
		addButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				route.add(moveDir.getSelectedIndex() + "-" + moveSteps.getSelectedIndex());
				// 追加动作信息
				jTextArea.append("第" + route.size() + "号动作:" + moveDir.getSelectedIndex() + "-"
						+ moveSteps.getSelectedIndex() + "\n");
				jTextArea.setCaretPosition(jTextArea.getText().length());
			}
		});

		// 确认按钮的监听器
		okButton.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// 判断名称长度
				if (actionName.getText().length() > 5) {
					// 如果新增，则判断名称是否重复
					if (!actionLib.isNameRepeat(actionName.getText()) || !isNew) {
						actionLib.registerAction(isNew, actionName.getText(), actionTypes.getSelectedItem().toString(),
								firstDir.getSelectedIndex(), route);
						new FCTip((isNew) ? "新建动作" : "编辑动作", "成功!");
						dispose();
					} else {
						new FCTip("新建动作", "名称已经存在!");
					}
				} else {
					new FCTip("新建动作", "名称长度不够!");
				}
			}
		});

		// 设置窗体可见
		setVisible(true);
	}
}
